
# 可变参数
"""
1. 概念 ： 通过定义为可变参数时，传入的参数数量就是可变的
2. 分类 ：列表形式的可变参数  ， 字典形式的可变参数 。
3. 列表形式的可变参数 ：
    (1). 定义 ： 在参数名前面加一个* ，传值的时候进来就变为一个元组 。
    (2). 传值 ：可以以位置参数传递 ，也可以以列表或元组的形式参数，前提是必须在列表或元组前加* .

4. 字典形式的可变参数
    (1). 定义 ： 在参数名前加两个** ,传值的时候进来就变为一个字典 。
    (2). 传值 ： 可以是以关键字形式传递 ，也可以以字典形式传递，前提是必须在字典前加**  。
"""


# 需求 ： 加法的操作 ，用户可以随便传任意个值
def add(x,y,*args):
    print("args:",args)
    z = x + y + sum(args)
    return z


# 调用
print(add(3,4))
print(add(3,4,5))
print(add(3,4,5,6))
print(add(3,4,5,6,7,8,9,10,11,11,1112))     # 以位置参数传递

# 以列表或元组的形式 。
print(add(3,4,*[5,6,2,1,8]))        # 前面加*代表传递的是列表里面的值
print(add(3,4,*(5,6,2,1,8)))        # 前面加*代表传递的是列表里面的值


print("="*50)
# 需求 ： 加法的操作 ，用户可以随便传任意个值
def add1(a,b,**kwargs):
    print("kwargs:",kwargs)
    z = 0
    for x in kwargs.values():
        z += x
    z += a +b
    return z

print(add1(3,4))
print(add1(3,4,c=5))
print(add1(3,4,c=5,d=6,x=7,y=9))        # 以关键字传递

print(add1(3,4,**{'c': 5, 'd': 6, 'x': 7, 'y': 9}))     # 以字典形式传递